// Package logger
// @File: logger.go
// @Description: 日志记录器
// @Author: YaoRuiQi
// @Date: 2025/8/23 02:54

package logger

import (
	"GinStandardTemplate/internal/pkg/jwt"
	"os"
	"path"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

var Logger *zap.Logger

// InitLogger
//
//	@Description: 初始化日志记录器
//	@param logSaveDirPath 日志保存的目录路径
//	@param showTerminalLog 是否在终端显示日志
//	@param logLevel 日志的级别
//	@param maxSize 单个日志文件的最大大小（MB）
//	@param maxAge 日志文件的最长保留时间（天）
//	@param maxBackups 最多保留的日志备份文件数量。
func InitLogger(
	logSaveDirPath string, showTerminalLog bool, logLevel zapcore.Level, maxSize int, maxAge int, maxBackups int,
) {
	level := zap.NewAtomicLevelAt(logLevel)
	lumberjackLogger := &lumberjack.Logger{
		Filename:   path.Join(logSaveDirPath, "app.log"), // 日志文件路径
		MaxSize:    maxSize,                              // 日志文件最大大小（MB）
		MaxAge:     maxAge,                               // 保留日志天数
		MaxBackups: maxBackups,                           // 最多保留备份数量
		Compress:   true,                                 // 压缩旧日志
		LocalTime:  true,                                 // 使用本地时间
	}
	fileEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
	fileWriter := zapcore.AddSync(lumberjackLogger)
	coreFile := zapcore.NewCore(fileEncoder, zapcore.AddSync(fileWriter), level)

	if showTerminalLog == true {
		consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
		consoleWriter := zapcore.Lock(os.Stdout)
		coreConsole := zapcore.NewCore(consoleEncoder, consoleWriter, level)
		Logger = zap.New(zapcore.NewTee(coreConsole, coreFile), zap.AddCaller())
	} else {
		Logger = zap.New(coreFile, zap.AddCaller())
	}
}

// NewLoggerWith
//
//	@Description: 创建一携带额外信息的logger
//	@param logger zap.Logger对象
//	@param requestId 请求唯一id
//	@param userData 用户数据
func NewLoggerWith(logger *zap.Logger, requestId string, userData *jwt.UserClaims) *zap.Logger {
	var reqLogger *zap.Logger
	if userData != nil {
		reqLogger = logger.With(
			zap.String("requestId", requestId),
			zap.Int64("userId", userData.UserID),
			zap.String("userRole", userData.UserRole),
		)
	} else {
		reqLogger = logger.With(zap.String("requestId", requestId))
	}
	return reqLogger
}
